package com.agile.leetcode.map;



import cn.hutool.core.lang.Pair;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;

/**
 * 阿里巴巴开发手册
 * 在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时，一定要使
 * 用含有参数类型为 BinaryOperator，参数名为 mergeFunction 的方法，否则当出现相同 key
 * 值时会抛出 IllegalStateException 异常。
 * 说明： 参数 mergeFunction 的作用是当出现 key 重复时，自定义对 value 的处理策略。
 *
 * @Author ChenZhangKun
 * @Date 2020/9/1 11:17
 */
public class MapPair {
    public static void main(String[] args) {
        List<Pair<String, String>> list = new ArrayList<>();
        list.add(new Pair<>("a", "1"));
        list.add(new Pair<>("b", "2"));
        list.add(new Pair<>("c", "3"));
        // 会覆盖前面的c的value值
        list.add(new Pair<>("c", "4"));
        list.add(new Pair<>("c", "5"));
        Map<String, String> collect = list.stream().collect(
                // v1 是相同时取第一个
                // v2 是相同时取最后一个
                Collectors.toMap(Pair::getKey, Pair::getValue, (v1, v2) -> v1)
        );
        System.out.println(collect);
        System.out.println(collect.getClass());
    }
}

/**
 * 函数式编程，自定义实现方法
 * binaryprator的使用
 */
class BinaryOperatorDemo {
    public static void main(String[] args) {
        BinaryOperator<Integer> binaryOperator = (v1, v2) -> {
            if (v1 > v2) {
                return v1;
            }
            return v2;
        };
        Integer apply = binaryOperator.apply(1, 2);
        System.out.println(apply.getClass());
        System.out.println(apply);
    }
}

final class MyList extends ArrayList {
    public static void main(String[] args) {
        List<Integer> list = new MyList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.forEach(System.out::println);
    }
}
